{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "dot product: $u \\cdot v$\n",
    "\n",
    "cross product: $u \\times v$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Picturing the dot product"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The dot product (also called the inner product) is an operation on two vectors that returns a scalar. In other words, given two vectors u and v, the result of u · v is a real number. The dot product works on vectors in 2D, 3D, or any number of dimensions."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can think of it as measuring “how aligned” the pair of input vectors are. Let’s first look at some vectors in the x,y plane and show their dot products to give you some intuition for how this operation works."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image.png](images/5.positiveVectorDot.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Two vectors that are pointing in similar directions have a positive dot product, and the larger the vectors, the larger the product. Smaller vectors that are similarly aligned have a smaller but still positive dot product."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By contrast, if two vectors point in opposite or near opposite directions, their dot product is negative. The bigger the magnitude of the vectors, the more negative their dot product."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image.png](images/6.negativeVectorDot.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Not all pairs of vectors clearly point in similar or opposite directions, and the dot product detects this. As figure 3.24 shows, if two vectors point in exactly perpendicular directions, their dot product is zero regardless of their lengths."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image.png](images/7.perpendicularDot.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The Dot product of vectors turns out to be one of the most important applications of the dot product: it lets us compute whether two vectors are perpendicular without doing any trigonometry. This perpendicular case also serves to separate the other cases: if the angle between two vectors is less than 90°, the vectors then have a positive dot product. If the angle is greater than 90°, they have a negative dot product."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Computing the dot product"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Given the coordinates for two vectors, there’s a simple formula to compute the dot product: multiply the corresponding coordinates and then add the products. \n",
    "\n",
    "For instance in the dot product (1, 2, –1) · (3, 0, 3), the product of the x-coordinate is 3, the product of the y-coordinate is 0, and the product of the z-coordinate is –3. The sum is 3 + 0 + (–3) = 0, so the dot product is zero. \n",
    "\n",
    "If my claim is correct, these two vectors should be perpendicular."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Dot products by example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from draw3d import *\n",
    "from vectors import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = (0,3,0)\n",
    "b = (0,0,-5)\n",
    "dot(a, b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "draw3d(\n",
    "    Arrow3D(a),\n",
    "    Arrow3D(b),\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It’s not surprising that two vectors lying on different axes have zero dot product."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also confirm that longer vectors give longer dot products. For instance, scaling either input vector by a factor of 2 doubles the output of the dot product:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "18"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dot((3,4),(2,3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "36"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dot(scale(2,(3,4)),(2,3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "36"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dot((3,4),scale(2,(2,3)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Measuring angles with the dot product"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The dot product u · v ranges from 1 to –1 times the product of the lengths of u and v as the angle ranges from 0 to 180°."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image.png](images/8.vectorDotProductRangesFrom0To180.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If |u| and |v| denote the lengths of vectors u and v, the dot product is given by:\n",
    "\n",
    "$\n",
    "u \\cdot v = \\lvert u \\rvert \\cdot \\lvert v \\rvert \\cdot cos(\\theta)\n",
    "$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Furthermore:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$\n",
    "cos(\\theta) = \\frac{u \\cdot v}{\\lvert u \\rvert \\cdot \\lvert v \\rvert}\n",
    "$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$\n",
    "\\theta = arccos(\\frac{u \\cdot v}{\\lvert u \\rvert \\cdot \\lvert v \\rvert})\n",
    "$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Anyway, in the end, the dot product will give you a single number."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
